package com.ruixiang.study;

import org.junit.Test;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * @author ruixinag
 * @description
 * @create Created in 2022/1/21 9:37
 */
public class Demo5 {
    public static void main(String[] args) throws Exception {

        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        // 编译器会阻止
//         list.add(333);

        // 但泛型约束只存在于编译期，底层仍是Object，所以运行期可以往List存入任何类型的元素
        Method addMethod = list.getClass().getDeclaredMethod("add", Object.class);
        addMethod.invoke(list, 333);

        // 打印输出观察是否成功存入Integer（注意用Object接收）
        for (Object obj : list) {
            System.out.println(obj);
        }
    }

    @Test
    public void test01(){
        // ArrayList<T>底层还是Object[]数组
        Object[] objects = new Object[4];

        // 引入泛型后的两个作用：

        // 1. 在编译期把元素类型限制为指定的类型，比如ArrayList<Integer>
        objects[0] = 1;
        objects[1] = 2;

        // 1. 在编译期把元素类型限制为指定的类型，比如ArrayList<String>
        objects[2] = "3";
        objects[3] = "4";

        // 2. 编译期编译后，会根据类型参数自动转换，不用我们操心。转为Integer
        Integer zero = (Integer) objects[0];
        Integer one = (Integer) objects[1];

        // 2. 编译期编译后，会根据类型参数自动转换，不用我们操心。转为String
        String two = (String) objects[2];
        String three = (String) objects[3];

        System.out.println(zero + " " + one + " " + two + " " + three);
    }


    @Test
    public void test2(){


    }

}
